// WindowLeft.hpp
// Created by Limou on 24-8-21.
//

#ifndef FRONTEND_WINDOWLEFT_HPP
#define FRONTEND_WINDOWLEFT_HPP

#include <QWidget>
#include <QVBoxLayout>
#include <QPushButton>
#include "../common/Common.hpp"
#include "../subassembly/SelfInfoWidget/SelfInfoWidget.hpp"
#include "../model/UserModel.hpp"

namespace chat_system::window {
    // >>> class WindowLeft begin >>>
    class WindowLeft : public QWidget {
    Q_OBJECT
    private:
        // 组件
        QPushButton* userAvatar_; // 登录用户头像
        QPushButton* sessionTab_; // 历史会话列表按钮
        QPushButton* friendTab_; // 已有好友列表按钮
        QPushButton* applyForTab_; // 好友申请列表按钮
        subassembly::SelfInfoWidget* selfInfoWidget_; // 个人卡片弹出窗口

        // 布局
        QVBoxLayout* vLayoutOfSelf_;

        // 数据
        model::UserModel user_; // 保持登录用户的信息
        common::TabType currentTab_; // 保存当前的标签类型

    public:
        // 构造方法
        explicit WindowLeft(QWidget* parent = nullptr) : QWidget(parent)
                , userAvatar_(new QPushButton(this))
                , sessionTab_(new QPushButton(this))
                , friendTab_(new QPushButton(this))
                , applyForTab_(new QPushButton(this))
                , selfInfoWidget_()
                , vLayoutOfSelf_(new QVBoxLayout())
                , currentTab_(common::TabType::SESSION_TAB) {
            this->setElement();
            this->setElementStaticData();
            this->setElementSize();
            this->setElementStyle();
            this->setElementLayout();
            this->setElementSignalSlot();
            this->setElementShow();
        }

        // 模拟按钮点击
        void onButtonClicked(const common::TabType& tabType) {
            if (tabType == common::TabType::SESSION_TAB) {
                sessionTab_->clicked();
            }
            else if (tabType == common::TabType::FRIENDS_TAB) {
                friendTab_->clicked();
            }
            else if (tabType == common::TabType::APPLY_FOR_TAB) {
                applyForTab_->clicked();
            }
        }

    signals:
        void loadWindowMiddle(const common::TabType& tabType); // 重新加载中间列表

    private:
        // 设置组件方法
        void setElement() {}

        // 设置组件数据方法
        void setElementStaticData() {
            sessionTab_->setIcon(QIcon(":/window/window_left/unenable/session.png"));
            friendTab_->setIcon(QIcon(":/window/window_left/unenable/friends.png"));
            applyForTab_->setIcon(QIcon(":/window/window_left/unenable/apply_for.png"));
        }

        // 设置组件尺寸方法
        void setElementSize() {
            this->setFixedWidth(54);
            this->setMinimumHeight(500);
            userAvatar_->setFixedSize(36, 36);
            userAvatar_->setIconSize(QSize(36, 36));
            sessionTab_->setFixedSize(36, 36);
            sessionTab_->setIconSize(QSize(36, 36));
            friendTab_->setFixedSize(36, 36);
            friendTab_->setIconSize(QSize(36, 36));
            applyForTab_->setFixedSize(36, 36);
            applyForTab_->setIconSize(QSize(36, 36));
        }

        // 设置组件风格方法
        void setElementStyle() {
            this->setStyleSheet("QWidget { background-color: rgb(46, 46, 46); border: 1px solid rgb(10, 11, 11); }");
            userAvatar_->setStyleSheet("QPushButton { background-color: transparent; border: none; } ");
            sessionTab_->setStyleSheet("QPushButton { background-color: transparent; border: none; } ");
            friendTab_->setStyleSheet("QPushButton { background-color: transparent; border: none; } ");
            applyForTab_->setStyleSheet("QPushButton { background-color: transparent; border: none; } ");
        }

        // 设置组件布局方法
        void setElementLayout() {
            // 设置水平布局管理器
            vLayoutOfSelf_->setSpacing(20);
            vLayoutOfSelf_->setContentsMargins(0, 35, 0, 10);
            vLayoutOfSelf_->addWidget(userAvatar_, 1, Qt::AlignTop | Qt::AlignHCenter);
            vLayoutOfSelf_->addWidget(sessionTab_, 1, Qt::AlignTop | Qt::AlignHCenter);
            vLayoutOfSelf_->addWidget(friendTab_, 1, Qt::AlignTop | Qt::AlignHCenter);
            vLayoutOfSelf_->addWidget(applyForTab_, 1, Qt::AlignTop | Qt::AlignHCenter);
            vLayoutOfSelf_->addStretch(20);
            this->setLayout(vLayoutOfSelf_);
        }

        // 设置组件显示方法
        void setElementShow() {
            TODO("读取缓存文件中的 json 用户信息");
            TODO("这里模拟了一个用户后期需要删除");

            auto avatarBtnIcon = QIcon(":/test/self.png");
            if (avatarBtnIcon.isNull()) { common::Tools::getInstance()->getLogger()->warn("SelfInfoWidget(): avatarBtnIcon is null"); }
            user_ = model::UserModel::makeUser(
                    "limou",
                    "13533330000",
                    "优雅永不过时",
                    avatarBtnIcon,
                    "1"
            );

            userAvatar_->setIcon(user_.getUserAvatarIco());
        }

        // 设置信号槽方法
        void setElementSignalSlot() {
            // 点击历史会话列表时进行切换
            connect(sessionTab_, &QPushButton::clicked, this, [this](){
                // 记录切换标签页后的状态
                currentTab_ = common::TabType::SESSION_TAB;

                // 调整按钮的显示情况
                sessionTab_->setIcon(QIcon(":/window/window_left/enable/session.png"));
                friendTab_->setIcon(QIcon(":/window/window_left/unenable/friends.png"));
                applyForTab_->setIcon(QIcon(":/window/window_left/unenable/apply_for.png"));

                // 重新加载会话列表
                emit this->loadWindowMiddle(currentTab_);
            });

            // 点击已有好友列表按钮时进行切换
            connect(friendTab_, &QPushButton::clicked, this, [this](){
                // 记录切换标签页后的状态
                currentTab_ = common::TabType::FRIENDS_TAB;

                // 调整按钮的显示情况
                sessionTab_->setIcon(QIcon(":/window/window_left/unenable/session.png"));
                friendTab_->setIcon(QIcon(":/window/window_left/enable/friends.png"));
                applyForTab_->setIcon(QIcon(":/window/window_left/unenable/apply_for.png"));

                // 重新加载好友列表
                emit this->loadWindowMiddle(currentTab_);
            });

            // 点击好友申请列表时进行切换
            connect(applyForTab_, &QPushButton::clicked, this, [this](){
                // 记录切换标签页后的状态
                currentTab_ = common::TabType::APPLY_FOR_TAB;

                // 调整按钮的显示情况
                sessionTab_->setIcon(QIcon(":/window/window_left/unenable/session.png"));
                friendTab_->setIcon(QIcon(":/window/window_left/unenable/friends.png"));
                applyForTab_->setIcon(QIcon(":/window/window_left/enable/apply_for.png"));

                // 重新加载申请列表
                emit this->loadWindowMiddle(currentTab_);
            });

            // 设置用户头像的点击名片功能
            connect(userAvatar_, &QPushButton::clicked, this, [this](){
                selfInfoWidget_ = new subassembly::SelfInfoWidget(user_);
                selfInfoWidget_->show(); // NOTE: 由于 SelfInfoWidget 的父类是 QDialog 默认不会跟随父组件进行显示, 需要手动进行调用, 这里使用 show() 貌似都可以 exec(), 个人认为 show() 更加优秀
            });
        }
    };
    // <<< class WindowLeft end <<<
} // class chat_system::window end

#endif //FRONTEND_WINDOWLEFT_HPP
